package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.PercepcionDAO;
import mx.ipn.persistencia.dao.PercepcionEmpleadoDAO;
import mx.ipn.persistencia.dao.EmpleadoDAO;
import mx.ipn.to.PercepcionEmpleadoTO;
import mx.ipn.to.EmpleadoTO;
import mx.ipn.to.PercepcionTO;

public class PercepcionEmpleadoDAOMySQL implements PercepcionEmpleadoDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(PercepcionEmpleadoDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO percepcion_empleado(id_percepcion,id_empleado) VALUES(?,?)";
	private static final String UPDATE = "UPDATE percepcion_empleado SET id_percepcion=?,id_empleado=? WHERE id_percepcion=? and id_empleado=?";
	private static final String FINDBYPERCEPCIONEMPLEADO = "SELECT * FROM percepcion_empleado WHERE id_percepcion=? and id_empleado=?";
	private static final String SELECT = "SELECT * FROM percepcion_empleado";
	private static final String SELECTBYPERCEPCION = "SELECT * FROM percepcion_empleado WHERE id_percepcion=?";
	private static final String SELECTBYEMPLEADO = "SELECT * FROM percepcion_empleado WHERE id_empleado=?";

	@Override
	public PercepcionEmpleadoTO findPercepcionEmpleadoByPercepcionEmpleado(
			int idPercepcion, int idEmpleado) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion
					.prepareStatement(FINDBYPERCEPCIONEMPLEADO);

			ps.setInt(1, idPercepcion);
			ps.setInt(2, idEmpleado);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {

				// Crea la fabrica especifica de MySQL
				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
				// Crea un DAO para la tabla TIPOEMPLEADO
				PercepcionDAO percepcionDAO = fabricaMySQL.getPercepcionDAO();
				EmpleadoDAO empleadoDAO = fabricaMySQL.getEmpleadoDAO();

				ArrayList<EmpleadoTO> listEmpleadoTO = new ArrayList<EmpleadoTO>();
				ArrayList<PercepcionTO> listPercepcionTO = new ArrayList<PercepcionTO>();

				listPercepcionTO.add(percepcionDAO
						.findPercepcionById(idPercepcion));
				listEmpleadoTO.add(empleadoDAO.findEmpleadoById(idEmpleado));

				PercepcionTO[] arrPercepcionTO = (PercepcionTO[])listPercepcionTO.toArray(new PercepcionTO[listPercepcionTO.size()]);		
				EmpleadoTO[] arrEmpleadoTO = (EmpleadoTO[])listEmpleadoTO.toArray(new EmpleadoTO[listEmpleadoTO.size()]);
			
				PercepcionEmpleadoTO percepcionEmpleadoTO = new PercepcionEmpleadoTO(
						arrPercepcionTO, arrEmpleadoTO);

				ps.close();
				conexion.close();
				return percepcionEmpleadoTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean insertPercepcionEmpleado(
			PercepcionEmpleadoTO percepcionEmpleadoTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setInt(1, percepcionEmpleadoTO.getIdPercepcion());
			ps.setInt(2, percepcionEmpleadoTO.getIdEmpleado());

			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public ArrayList<PercepcionEmpleadoTO> selectPercepcionEmpleado() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			PercepcionDAO percepcionDAO = null;
			EmpleadoDAO empleadoDAO = null;

			ArrayList<PercepcionEmpleadoTO> percepcionEmpleadoTO = null;
			PercepcionEmpleadoTO percepcionEmpleadoTO2 = null;

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (percepcionEmpleadoTO == null) {
					percepcionEmpleadoTO = new ArrayList<PercepcionEmpleadoTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					percepcionDAO = fabricaMySQL.getPercepcionDAO();
					empleadoDAO = fabricaMySQL.getEmpleadoDAO();
				}

				int idPercepcion = rs.getInt("id_percepcion");
				int idEmpleado = rs.getInt("id_empleado");

				ArrayList<PercepcionTO> listPercepcionTO = new ArrayList<PercepcionTO>();
				ArrayList<EmpleadoTO> listEmpleadoTO = new ArrayList<EmpleadoTO>();

				listPercepcionTO.add(percepcionDAO
						.findPercepcionById(idPercepcion));
				listEmpleadoTO.add(empleadoDAO.findEmpleadoById(idEmpleado));

				PercepcionTO[] arrPercepcionTO = (PercepcionTO[])listPercepcionTO.toArray(new PercepcionTO[listPercepcionTO.size()]);		
				EmpleadoTO[] arrEmpleadoTO = (EmpleadoTO[])listEmpleadoTO.toArray(new EmpleadoTO[listEmpleadoTO.size()]);
				
				percepcionEmpleadoTO2 = new PercepcionEmpleadoTO(
						arrPercepcionTO, arrEmpleadoTO);

				percepcionEmpleadoTO.add(percepcionEmpleadoTO2);
			}
			ps.close();
			conexion.close();
			return percepcionEmpleadoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public PercepcionEmpleadoTO selectPercepcionEmpleadoByPercepcion(
			int idPercepcion) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			PercepcionDAO percepcionDAO = null;
			EmpleadoDAO empleadoDAO = null;

			ArrayList<EmpleadoTO> listEmpleadoTO = null;
			ArrayList<PercepcionTO> listPercepcionTO = null;

			PercepcionEmpleadoTO percepcionEmpleadoTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYPERCEPCION);
			ps.setInt(1, idPercepcion);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listEmpleadoTO == null) {

					listEmpleadoTO = new ArrayList<EmpleadoTO>();
					listPercepcionTO = new ArrayList<PercepcionTO>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					empleadoDAO = fabricaMySQL.getEmpleadoDAO();
					percepcionDAO = fabricaMySQL.getPercepcionDAO();
				}

				listEmpleadoTO.add(empleadoDAO.findEmpleadoById(rs
						.getInt("id_empleado")));

			}
			if (listEmpleadoTO != null) {

				listPercepcionTO.add(percepcionDAO.findPercepcionById(idPercepcion));
				
				PercepcionTO[] arrPercepcionTO = (PercepcionTO[])listPercepcionTO.toArray(new PercepcionTO[listPercepcionTO.size()]);		
				EmpleadoTO[] arrEmpleadoTO = (EmpleadoTO[])listEmpleadoTO.toArray(new EmpleadoTO[listEmpleadoTO.size()]);
				
				percepcionEmpleadoTO = new PercepcionEmpleadoTO(arrPercepcionTO,
						arrEmpleadoTO);
			}
			ps.close();
			conexion.close();
			return percepcionEmpleadoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public PercepcionEmpleadoTO selectPercepcionEmpleadoByEmpleado(int idEmpleado) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			EmpleadoDAO empleadoDAO = null;
			PercepcionDAO percepcionDAO = null;

			ArrayList<EmpleadoTO> listEmpleadoTO = null;
			ArrayList<PercepcionTO> listPercepcionTO = null;

			PercepcionEmpleadoTO percepcionEmpleadoTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYEMPLEADO);
			ps.setInt(1, idEmpleado);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listEmpleadoTO == null) {

					listPercepcionTO = new ArrayList<PercepcionTO>();
					listEmpleadoTO = new ArrayList<EmpleadoTO>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					empleadoDAO = fabricaMySQL.getEmpleadoDAO();
					percepcionDAO = fabricaMySQL.getPercepcionDAO();
				}

				listPercepcionTO.add(percepcionDAO.findPercepcionById(rs
						.getInt("id_percepcion")));

			}
			if (listPercepcionTO != null) {

				listEmpleadoTO.add(empleadoDAO.findEmpleadoById(idEmpleado));
				
				PercepcionTO[] arrPercepcionTO = (PercepcionTO[])listPercepcionTO.toArray(new PercepcionTO[listPercepcionTO.size()]);		
				EmpleadoTO[] arrEmpleadoTO = (EmpleadoTO[])listEmpleadoTO.toArray(new EmpleadoTO[listEmpleadoTO.size()]);
			
				percepcionEmpleadoTO = new PercepcionEmpleadoTO(
						arrPercepcionTO, arrEmpleadoTO);
			}
			ps.close();
			conexion.close();
			return percepcionEmpleadoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short updatePercepcionEmpleado(PercepcionEmpleadoTO percepcionEmpleadoTO,
			PercepcionEmpleadoTO percepcionEmpleadoTONuevo) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);

			ps.setInt(1, percepcionEmpleadoTONuevo.getIdPercepcion());
			ps.setInt(2, percepcionEmpleadoTONuevo.getIdEmpleado());
			ps.setInt(3, percepcionEmpleadoTO.getIdPercepcion());
			ps.setInt(4, percepcionEmpleadoTO.getIdEmpleado());

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

}
